package cli;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.text.ParseException;
import java.util.ArrayList;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import au.com.bytecode.opencsv.CSVReader;

public class CSV {
	
	static Element racine;
	static Document document;
	
	static ArrayList<String[]> readCSVFile(String chemin) throws Exception{
		
		String[] line;
		ArrayList<String[]> liste = new ArrayList<String[]>();

		CSVReader reader;
		try {
			reader = new CSVReader(new FileReader(chemin), ';',
					'\'');
			
			// Ajout de chaque ligne du fichier dans la liste
			while((line = reader.readNext()) != null){
				liste.add(line);
			}		
			reader.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
		// Supprime la première ligne de la liste puisqu'elle contient les noms des colonnes et non les valeurs
		liste.remove(0);
		
		return liste;
	}
	
	public ArrayList<Reservation> readReservation(ArrayList<String[]> liste, String file){
		int i;
		ArrayList<Reservation> liste_reservation = new ArrayList<Reservation>();
		
		// Pour toutes les lignes de la liste
		for (i = 0; i < liste.size(); i++) {
			String[] ligne = liste.get(i);
			
			// Affectation des valeurs à des variables ayant des noms explicites
			String sref_evt = ligne[0];
			Integer intref_evt = new Integer(sref_evt);
			int ref_evt = intref_evt.intValue();
			
			// Converti une chaine de caractère en entier pour traitements
			String sref_client = ligne[1];
			Integer intref_client = new Integer(sref_client);
			int ref_client = intref_client.intValue();
			
			String nom = ligne[2];
			
			String prenom = ligne[3];
			
			String sage = ligne[4];
			Integer intage = new Integer(sage);
			int age = intage.intValue();
			
			String reduction = ligne[5];
			
			// Appel du constructeur correspondant au type de la liste et recupération de l'exception si il y a une erreur
			try {
				liste_reservation.add(new Reservation(ref_evt, ref_client, nom, prenom, age, reduction, file));
			}
			catch (R1Exception e) {
			}
			catch(R2Exception e) {
			}
			catch(R3Exception e) {
			}
			catch (ParseException e) {
				e.printStackTrace();
			}
		}		
		return liste_reservation;
	}
	
	public ArrayList<Concert> readConcert(ArrayList<String[]> liste, String file) throws Exception{
		int i;
		
		ArrayList<Concert> liste_concert = new ArrayList<Concert>();
		
		for (i = 0; i < liste.size(); i++) {
			String[] ligne = liste.get(i);
			
			String sref_evt = ligne[0];
			Integer intref_evt = new Integer(sref_evt);
			int ref_evt = intref_evt.intValue();
			
			String date = ligne[1];
			
			String h_debut = ligne[2];
			
			String h_fin = ligne[3];
			
			String sprix = ligne[4];
			Integer intprix = new Integer(sprix);
			int prix = intprix.intValue();
			
			String splaces = ligne[5];
			Integer intplaces = new Integer(splaces);
			int places = intplaces.intValue();
			
			String artiste = ligne[6];
				
			String style = ligne[7];

			try{
				liste_concert.add(new Concert(ref_evt, date, h_debut, h_fin, prix, places, artiste, style, file));
			}
			catch (M1Exception e) {
			}
			catch(M2Exception e) {
			}
			catch(M3Exception e) {
			}
			catch(M4Exception e) {
			}
			catch(M5Exception e) {
			}
			catch (Exception e) {
			}
		}
		return liste_concert;
	}
	
	public ArrayList<Hockey> readHockey(ArrayList<String[]> liste, String file) throws Exception{
		int i;
		int verifs;
		
		SAXBuilder sax = new SAXBuilder();
		
		ArrayList<Hockey> liste_hockey = new ArrayList<Hockey>();
		
		for (i = 0; i < liste.size(); i++) {
			String[] ligne = liste.get(i);
			
			String sref_evt = ligne[0];
			Integer intref_evt = new Integer(sref_evt);
			int ref_evt = intref_evt.intValue();
			
			String date = ligne[1];
			
			String h_debut = ligne[2];
			
			String h_fin = ligne[3];
			
			String sprix = ligne[4];
			Integer intprix = new Integer(sprix);
			int prix = intprix.intValue();
			
			String splaces = ligne[5];
			Integer intplaces = new Integer(splaces);
			int places = intplaces.intValue();
			
			String equipe1 = ligne[6];
				
			String equipe2 = ligne[7];
			
			String compet = ligne[8];
			
			String arbitre = ligne[9];

			// Si l'ouverture du document est possible, alors la table xml est déjà créee et ce n'est donc pas une importation.
			//Les listes doivent donc être validées.
			try {
				document = sax.build(new File(file));
				verifs = 1;
				liste_hockey.add(new Hockey(ref_evt, date, h_debut, h_fin, prix, places, equipe1, equipe2, compet, arbitre, verifs));
			}
			catch (M1Exception e) {
			}
			catch(M2Exception e) {
			}
			catch(M3Exception e) {
			}
			catch(M4Exception e) {
			}
			catch(M5Exception e) {
			}
			catch (Exception e){
				verifs = 0;
				liste_hockey.add(new Hockey(ref_evt, date, h_debut, h_fin, prix, places, equipe1, equipe2, compet, arbitre, verifs));
			}
		}
		return liste_hockey;
	}
	
	public ArrayList<Patinage> readPatinage(ArrayList<String[]> liste) throws Exception{
		int i;
		ArrayList<Patinage> liste_patinage = new ArrayList<Patinage>();
		
		for (i = 0; i < liste.size(); i++) {
			String[] ligne = liste.get(i);

			String date = ligne[0];
			
			String h_debut = ligne[1];
			
			String h_fin = ligne[2];
			
			String sprix = ligne[3];
			Integer intprix = new Integer(sprix);
			int prix = intprix.intValue();

			try {
				liste_patinage.add(new Patinage(date, h_debut, h_fin, prix));
			}
			catch (Exception e) {
			}
		}
		return liste_patinage;
	}
}